<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        var length = 10;

        function fn() {
            console.log(this.length);
        }
        var obj = {
            length: 5,
            methods: function (fn) {
                fn();
                arguments[0]();
            }
        }
        obj.methods(fn, 1);
        // 输出10,2
        输出:
            2
        // 为什么 不是10和5 ?
        //     首先， 由于fn作为函数方法的参数传递， 函数fn的作用域(this)
        // 是窗口。
        // var length = 10;
        // 在窗口级别声明。 它也可以作为win -
        //     dow.length或length或this.length来访问(当这个 === 窗口时)。
        // 方法绑定到Object obj, obj.method用参数fn和1调用。 虽然方法
        // 只接受一 - 个参数， 但调用它时已经传递了两个参数;
        // 第一个是函数回
        // 调， 其他只是一个数字。
        // 当在内部方法中调用fn() 时， 该函数在全局级别作为参数传递，
        // this.length将有权访问在Object obj中定义的var length = 10(全 局声明) 而不是length = 5。
        // 现在， 我们知道我们可以使用arguments数组访问JavaScript函
        // 数中的任意数量的参数。
        // 因此arguments0只不过是调用fn()。 在fn里面， 这个函数的作用域
        // 成为参数数组， 并且记录参数0的长度将返回2。
        // 因此输出将如上所述。
    </script>
</body>

</html>